﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _6_1_MathTool
{
    public class MathTool
    {
        #region 1.二维点A,二维点B, 长度L(L>0 表示AB延长L;L<0 表示AB收缩L),计算该点坐标
        //double[] pointA;     A点的坐标
        //double[] pointB;     B点的坐标
        //double L;            L的长度
        public static double[] LPointCoordinates(double[] pointA, double[] pointB, double L)
        {
            // 向量AB的坐标
            double vectorAB_X = pointB[0] - pointA[0];
            double vectorAB_Y = pointB[1] - pointA[1];
            // 向量AB的长度
            double vectorAB_length = Math.Sqrt(Math.Pow(vectorAB_X, 2) + Math.Pow(vectorAB_Y, 2));

            //AB的单位向量
            double unit_vector_AB_X = vectorAB_X / vectorAB_length;
            double unit_vector_AB_Y = vectorAB_Y / vectorAB_length;

            // L的长度
            double L_Length = Math.Abs(L);

            // 如果L小于0，说明向量AB需要收缩，所以要把向量AL变成负值
            if (L < 0)
            {
                L_Length = -L_Length;
            }
            // 向量AL的X,Y坐标
            double vectorAL_X = unit_vector_AB_X * L_Length;
            double vectorAL_Y = unit_vector_AB_Y * L_Length;

            // L的坐标
            double L_X = pointA[0] + vectorAB_X + vectorAL_X;
            double L_Y = pointA[1] + vectorAB_Y + vectorAL_Y;
            return new double[] { L_X, L_Y };

        }
        #endregion
        
        #region 2.二维A,通过点A的方向角,通过A点平移值offset(左侧为负值,右侧为正值),计算该点坐标
        public static double[] AOffsetCoordinate(double[] pointA, double offset)
        {
            // double[] pointA; A点坐标
            // offset 平移的距离
            // double[] A_Offset 平移后的A点

            // A点X轴的平移值
            double A_Xoffset = pointA[0] + offset;
            double[] A_Offset = new double[2] { A_Xoffset, pointA[1] };
            return A_Offset;



        }

        #endregion

        #region 3.二维点A,二维点B,旋转角Rotation_A(绕A点,逆时针旋转),通过A点的极坐标半径长度为R,求该点坐标

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pointA">点A的坐标</param>
        /// <param name="pointB">点B的坐标</param>
        /// <param name="r">旋转的角度</param>
        /// <param name="rotation_A">半径</param>
        /// <returns> B点的坐标 </returns>
        public static double[] BRotationCoordinates(double[] pointA,double[] pointB, double r, double rotation_A)
        {
            double vectorABx = pointB[0] - pointA[0];
            double vectorABy = pointB[1] - pointA[1];
            // 向量AB的模
            double vectorAB_length = Math.Sqrt(Math.Pow(vectorABx,2) + Math.Pow(vectorABy,2));
            double B_y = Math.Sin(rotation_A * Math.PI) /180;
            double B_x = Math.Cos(rotation_A * Math.PI) /180;
        }
        #endregion
    }
}
